package alkuperainen;
import java.util.*;

public class UI {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Ajanhallinta jarjestelma = new Ajanhallinta();
		
		Scanner lukija = new Scanner(System.in);
		int mode = 1; //nykyinen n�kym�: 1 = p��valikko, 2 = kurssilista, 3 = opiskelijalista, 4 = kurssitiedot, 5 = opiskelijatiedot
		Kurssi tarkasteltavaKurssi = null;
		Opiskelija tarkasteltavaOpiskelija = null;
		String syote = "";
		//boolean pkurssilista = false;
		//boolean popiskelijalista = false;
		String case1 = "Ohjeet:\n" +
						"'kurssi' tai '-k' - n�yt� kurssilista\n" + 
						"'opiskelija' tai '-o' - n�yt� opiskelijalista\n" +
						"'lopeta' - lopeta ohjelma\n";
		String case2 = "Ohjeet:\n" +
						"kurssinumero - n�yt� kurssin tiedot\n" + 
						"'lis��' tai '-l' - lis�� uusi kurssi\n" +
						"'poista' tai '-p' - poista kurssi\n" +
						"'takaisin' tai '-t' - edelliseen n�kym��n\n" +
						"'lopeta' - lopeta ohjelma\n";
		String case3 = "Ohjeet:\n" +
						"opiskelijanumero - n�yt� opiskelijan tiedot\n" + 
						"'lis��' tai '-l' - lis�� uusi opiskelija\n" +
						"'takaisin' tai '-t' - edelliseen n�kym��n\n" +
						"'lopeta' - lopeta ohjelma\n";
		String case4 = "Ohjeet:\n" +
						"'opiskelija' tai '-o' - n�yt� opiskelijalista\n" + 
						"'tapahtuma' tai '-a' - luo kurssille uusi tapahtuma\n" +
						"'takaisin' tai '-t' - edelliseen n�kym��n\n" +
						"'lopeta' - lopeta ohjelma\n";
		String case5 = "Ohjeet:\n" +
						"'kurssi' tai '-k' - n�yt� opiskelijan kurssilista\n" + 
						"'tapahtuma' tai '-a' - luo opiskelijalle uusi tapahtuma\n" +
						"'merkitse' tai '-m' - merkitse kurssi suoritetuksi\n" +
						"'vie' tai '-v' - vie kalenteri HTML-tiedostoksi" +
						"'takaisin' tai '-t' - edelliseen n�kym��n\n" +
						"'lopeta' - lopeta ohjelma\n";
		
		System.out.println("Ajanhallintaj�rjestelm�\n");
		System.out.println(case1);
		
		do {
			switch (mode){
			
			//"p��valikko"
			case 1:	
					if (syote.equalsIgnoreCase("kurssi") || syote.equalsIgnoreCase("-k")){
						System.out.println(case2);
						System.out.println("Kurssilista:\n");
						printKurssilista(jarjestelma.getKaikkiKurssit());
						mode = 2;
						//pkurssilista = true;
					}
					if (syote.equalsIgnoreCase("opiskelija") || syote.equalsIgnoreCase("-o")){
						System.out.println(case3);
						printOpiskelijalista(jarjestelma.getKaikkiOpiskelijat());
						mode = 3;
						//popiskelijalista = true;
					}
					break;
					
			//kurssilista
			case 2:	
					if (syote.equalsIgnoreCase("takaisin") || syote.equalsIgnoreCase("-t")){
						if (tarkasteltavaOpiskelija == null){
							mode = 1;
							System.out.println(case1);
						}
						else {
							System.out.println(case5);
							printOpiskelijatiedot(tarkasteltavaOpiskelija);
							mode = 5;
						}
					}
					if (syote.equalsIgnoreCase("lis��") || syote.equalsIgnoreCase("-l")){
						if (tarkasteltavaOpiskelija == null){
							lisaaKurssi(jarjestelma);
							System.out.println(case2);
							System.out.println("Kurssilista:\n");
							printKurssilista(jarjestelma.getKaikkiKurssit());
						}
						else {
							printKurssilista(jarjestelma.getKaikkiKurssit());
							System.out.println("Anna kurssin numero:");
							syote = lukija.next();
							ArrayList<Kurssi> kurssilista = jarjestelma.getKaikkiKurssit();
							printKurssilista(kurssilista);
							boolean loydetty = false;
							for (int i = 0; i < kurssilista.size(); i++)
								if (syote.equalsIgnoreCase("" + kurssilista.get(i).getKurssinro())){
									tarkasteltavaOpiskelija.lisaaIlmoittautuminen(kurssilista.get(i));
									System.out.println("Lis�tty ilmoittautuminen kurssille " + kurssilista.get(i).getNimi());
									loydetty = true;
									break;
								}
							if (!loydetty)
								System.out.println("Kurssia " + syote + " ei l�ytynyt.");
							System.out.println(case5);
							printOpiskelijatiedot(tarkasteltavaOpiskelija);
							mode = 5;
							break;
						}
					}
					if (syote.equalsIgnoreCase("poista") || syote.equalsIgnoreCase("-p")) {
						poistaKurssi(jarjestelma);
					}
					
					//if (pkurssilista) {
						//pkurssilista = false;
						ArrayList<Kurssi> kurssilista = jarjestelma.getKaikkiKurssit();
						for (int i = 0; i < kurssilista.size(); i++)
							if (syote.equalsIgnoreCase("" + kurssilista.get(i).getKurssinro())){
								System.out.println(case4);
								Kurssi k = kurssilista.get(i);
								printKurssitiedot(k);
								mode = 4;
								tarkasteltavaKurssi = k;
								//popiskelijalista = true;
							}
						
					//}
					break;
			
			//opiskelijalista
			case 3: 
					if (syote.equalsIgnoreCase("takaisin") || syote.equalsIgnoreCase("-t")){
						if (tarkasteltavaKurssi == null){
							mode = 1;
							System.out.println(case1);
						}
						else {
							System.out.println(case4);
							printKurssitiedot(tarkasteltavaKurssi);
							mode = 4;
						}
					}
					if (syote.equalsIgnoreCase("lis��") || syote.equalsIgnoreCase("-l")){
						if (tarkasteltavaKurssi == null){
							lisaaOpiskelija(jarjestelma);
							System.out.println(case3);
							printOpiskelijalista(jarjestelma.getKaikkiOpiskelijat());
						}
						else {
							printOpiskelijalista(jarjestelma.getKaikkiOpiskelijat());
							System.out.println("Anna opiskelijan numero:");
							syote = lukija.next();
							ArrayList<Opiskelija> opiskelijalista = jarjestelma.getKaikkiOpiskelijat();
							printOpiskelijalista(opiskelijalista);
							boolean loydetty = false;
							for (int i = 0; i < opiskelijalista.size(); i++)
								if (syote.equalsIgnoreCase("" + opiskelijalista.get(i).getOpnro())){
									tarkasteltavaKurssi.lisaaOpiskelija(opiskelijalista.get(i));
									System.out.println(opiskelijalista.get(i).getNimi() + " lis�ttiin kurssille.");
									loydetty = true;
									break;
								}
							if (!loydetty)
								System.out.println("Opiskelijaa " + syote + " ei l�ytynyt.");
							System.out.println(case4);
							printKurssitiedot(tarkasteltavaKurssi);
							mode = 4;
							break;
						}
					}
					//if (popiskelijalista) {
						//popiskelijalista = false;
						ArrayList<Opiskelija> opiskelijalista = jarjestelma.getKaikkiOpiskelijat();
						for (int i = 0; i < opiskelijalista.size(); i++)
							if (syote.equalsIgnoreCase("" + opiskelijalista.get(i).getOpnro())){
								System.out.println(case5);
								Opiskelija o = opiskelijalista.get(i);
								printOpiskelijatiedot(o);
								mode = 5;
								tarkasteltavaOpiskelija = o;
							}
					//}
					break;
			
			//kurssin tiedot
			case 4: 
					if (syote.equalsIgnoreCase("opiskelija") || syote.equalsIgnoreCase("-o")){
						System.out.println(case3);
						ArrayList<Opiskelija> opiskelijat = tarkasteltavaKurssi.getOpiskelijat();
						printOpiskelijalista(opiskelijat);
						mode = 3;
						//popiskelijalista = true;
					}
					if (syote.equalsIgnoreCase("tapahtuma") || syote.equalsIgnoreCase("-a")){
						tarkasteltavaKurssi.lisaaTapahtuma(luoTapahtuma());
						System.out.println(case4);
						printKurssitiedot(tarkasteltavaKurssi);
						break;
					}
					if (syote.equalsIgnoreCase("takaisin") || syote.equalsIgnoreCase("-t")){
						tarkasteltavaKurssi = null;
						if (tarkasteltavaOpiskelija == null){
							mode = 1;
							System.out.println(case1);
						}
						else {
							System.out.println(case5);
							printOpiskelijatiedot(tarkasteltavaOpiskelija);
							mode = 5;
						}
					}
					break;
					
			//opiskelijan tiedot
			case 5:	
					if (syote.equalsIgnoreCase("kurssi") || syote.equalsIgnoreCase("-k")){
						System.out.println(case2);
						System.out.println("Suoritettu:");
						printKurssilista(tarkasteltavaOpiskelija.getSuoritukset());
						System.out.println("Suorittamatta:");
						printKurssilista(tarkasteltavaOpiskelija.getIlmot());
						mode = 2;
						//pkurssilista = true;
						
					}
					if (syote.equalsIgnoreCase("tapahtuma") || syote.equalsIgnoreCase("-a")){
						tarkasteltavaOpiskelija.lisaaTapahtuma(luoTapahtuma());
						System.out.println(case5);
						printOpiskelijatiedot(tarkasteltavaOpiskelija);
						break;
					}
					if (syote.equalsIgnoreCase("merkitse") || syote.equalsIgnoreCase("-m")){
						System.out.println("Suorittamatta:");
						printKurssilista(tarkasteltavaOpiskelija.getIlmot());
						System.out.println("\nAnna suoritettavan kurssin numero:");
						syote = lukija.next();
						ArrayList<Kurssi> kurssit = jarjestelma.getKaikkiKurssit();
						boolean loydetty = false;
						for (int i = 0; i < kurssit.size(); i++)
							if (syote.equalsIgnoreCase("" + kurssit.get(i).getKurssinro())){
								tarkasteltavaOpiskelija.lisaaSuoritus(kurssit.get(i));
								System.out.println("Lis�tty suoritus kurssille " + kurssit.get(i).getNimi());
								loydetty = true;
								break;
							}
						if (!loydetty)
							System.out.println("Kurssia " + syote + " ei l�ytynyt.");
						System.out.println(case5);
						printOpiskelijatiedot(tarkasteltavaOpiskelija);
						
					}
					if (syote.equalsIgnoreCase("vie") || syote.equalsIgnoreCase("-v")){
                        String tiedostopolku;
                        System.out.println("Anna kohdetiedoston nimi:");
                        tiedostopolku = lukija.next();
                        if (!jarjestelma.vieHTML(tarkasteltavaOpiskelija, tiedostopolku))
                                System.out.println("Kalenterin vieminen ep�onnistui. Tarkista, ett� kohdetiedostoon on kirjoitusoikeudet");
                        else
                                System.out.println("Kalenteri viety onnistuneesti.");
                        System.out.println(case5);
                        printOpiskelijatiedot(tarkasteltavaOpiskelija);
                        break;
                }

					if (syote.equalsIgnoreCase("takaisin") || syote.equalsIgnoreCase("-t")){
						tarkasteltavaOpiskelija = null;
						if (tarkasteltavaKurssi == null){
							mode = 1;
							System.out.println(case1);
						}
						else {
							System.out.println(case4);
							printKurssitiedot(tarkasteltavaKurssi);
							mode = 4;
						}
					}
					break;
			}
			
			syote = lukija.next();
		} while (!syote.equalsIgnoreCase("lopeta"));
		jarjestelma.tallenna();
	}

	private static void printKurssilista(ArrayList<Kurssi> lista){
		Kurssi k;
		for (int i = 0; i < lista.size(); i++){
			k = lista.get(i);
			System.out.println(k.getNimi()+ ", kurssinumero: " + k.getKurssinro() + ", op: " + k.getOp() + " op"+ ", kesto: " + k.getAlkupaiva() + " - " + k.getLoppupaiva());
		}
	}
	
	private static void printOpiskelijalista(ArrayList<Opiskelija> lista){
		Opiskelija o;
		System.out.println("Opiskelijalista:\n");
		for (int i = 0; i < lista.size(); i++){
			o = lista.get(i);
			System.out.println(o.getNimi()+ ", opiskelijanumero: " + o.getOpnro() + ", op: " + o.countOp() + " op");
		}
	}
	
	private static void printKurssitiedot(Kurssi k){
		Tapahtuma t;
		System.out.println("Kurssi " + k.getKurssinro() + ": " + k.getNimi() +
							"\n" + k.getOp() + " op\n"
							+ "kesto: " + k.getAlkupaiva() + " - " + k.getLoppupaiva());
		
		
		ArrayList<Tapahtuma> kurssinTapahtumat = k.getTapahtumat();
		if (kurssinTapahtumat.size() > 0) {
			System.out.println("Kurssin tapahtumat:\n");
			for (int i = 0; i < kurssinTapahtumat.size(); i++) {
				t = kurssinTapahtumat.get(i);
				System.out.print(t.getPaiva() +" "); 
				t.printAlkuAika();
				System.out.print(" - ");
				t.printLoppuAika();
				System.out.print(" " + t.getNimi() +", "+ t.getPaikka() + "\n"); 
			}
		}
		else {
			System.out.println("Kurssille ei ole viel� lis�tty tapahtumia.");
		}
		
	}
	
	private static void printOpiskelijatiedot(Opiskelija o){
		System.out.println("Opiskelija " + o.getOpnro() + ":" + o.getNimi() +
							"\n" + o.countOp() + " op suoritettu " + o.countSuunniteltuOp() + ":sta\n");
		System.out.println("Tapahtumat t�n��n:");
		ArrayList<Tapahtuma> tanaan = new ArrayList<Tapahtuma>();
		GregorianCalendar nyt = new GregorianCalendar(); //ei parametreja = nykyhetki
		ArrayList<Tapahtuma> t = o.getTapahtumat();
		for (int i = 0; i < t.size(); i++)
			if (t.get(i).onkoTanaan(nyt)){
				tanaan.add(t.get(i));
			}
		ArrayList<Kurssi> kurssit = o.getIlmot();
		for (int i = 0; i < kurssit.size(); i++){
			t = kurssit.get(i).getTapahtumat();
			for (int j = 0; j < t.size(); j++)
				if (t.get(j).onkoTanaan(nyt)){
					tanaan.add(t.get(j));
				}
		}
		
		Object[] tanaan2 = tanaan.toArray();
		Arrays.sort(tanaan2);
		Tapahtuma kasiteltava;
		for (int i = 0; i < tanaan2.length; i++){
			kasiteltava = (Tapahtuma)tanaan2[i];
			System.out.println(kasiteltava.getAlkuaika() + " - " + kasiteltava.getLoppuaika() + ": " + kasiteltava.getNimi() + ", " + kasiteltava.getPaikka());
		}
	}
	
	private static void lisaaKurssi(Ajanhallinta jarj){
		Scanner lukija = new Scanner(System.in);
		System.out.println("Anna kurssin nimi:");
		String nimi = lukija.nextLine();
		ArrayList<Kurssi> kurssit = jarj.getKaikkiKurssit();
		int kurssinro;
		String input;
	l:	while (true){
			System.out.println("Anna kurssin numero:");
			input = lukija.next();
			kurssinro = parsePosInt(input);
			if (kurssinro < 0)
				continue;
			for (int i = 0; i < kurssit.size(); i++)
				if (kurssit.get(i).getKurssinro() == kurssinro){
					System.out.println(kurssinro + " on jo k�yt�ss�");
					continue l;
				}
			break;
		}
		int op;
		while (true){
			System.out.println("Anna kurssin opintopistem��r�:");
			input = lukija.next();
			op = parsePosInt(input);
			if (op < 0)
				continue;
			break;
		}
		int alkupaiva;
		while (true){
			System.out.println("Anna kurssin alkup�iv�:");
			input = lukija.next();
			alkupaiva = parsePosInt(input);
			if (alkupaiva < 0)
				continue;
			break;
		}
		int alkukuu;
		while (true){
			System.out.println("Anna kurssin alkukuu:");
			input = lukija.next();
			alkukuu = parsePosInt(input);
			if (alkukuu < 0)
				continue;
			break;
		}
		int alkuvuosi;
		while (true){
			System.out.println("Anna kurssin alkuvuosi:");
			input = lukija.next();
			alkuvuosi = parsePosInt(input);
			if (alkuvuosi < 0)
				continue;
			break;
		}
		int loppupaiva;
		while (true){
			System.out.println("Anna kurssin loppup�iv�:");
			input = lukija.next();
			loppupaiva = parsePosInt(input);
			if (loppupaiva < 0)
				continue;
			break;
		}
		int loppukuu;
		while (true){
			System.out.println("Anna kurssin loppukuu:");
			input = lukija.next();
			loppukuu = parsePosInt(input);
			if (loppukuu < 0)
				continue;
			break;
		}
		int loppuvuosi;
		while (true){
			System.out.println("Anna kurssin loppuvuosi:");
			input = lukija.next();
			loppuvuosi = parsePosInt(input);
			if (loppuvuosi < 0)
				continue;
			break;
		}
		jarj.luoKurssi(nimi, kurssinro, op, alkupaiva, alkukuu, alkuvuosi, loppupaiva, loppukuu, loppuvuosi);
	}
	
	private static void lisaaOpiskelija(Ajanhallinta jarj){
		Scanner lukija = new Scanner(System.in);
		System.out.println("Anna opiskelijan nimi:");
		String nimi = lukija.nextLine();
		ArrayList<Opiskelija> opiskelijat = jarj.getKaikkiOpiskelijat();
		int opnro;
		String input;
	l:	while (true){
			System.out.println("Anna opiskelijanumero:");
			input = lukija.next();
			opnro = parsePosInt(input);
			if (opnro < 0)
				continue;
			for (int i = 0; i < opiskelijat.size(); i++)
				if (opiskelijat.get(i).getOpnro() == opnro){
					System.out.println(opnro + " on jo k�yt�ss�");
					continue l;
				}
			break;
		}
		jarj.luoOpiskelija(nimi, opnro);
	}
	
	private static void poistaKurssi(Ajanhallinta jarj) {
		Scanner lukija = new Scanner(System.in);
		ArrayList<Kurssi> kurssit = jarj.getKaikkiKurssit();
		String syote;
		int kurssinumero;
		
	l:	while (true) {
			System.out.println("Anna poistettavan kurssin numero. 'takaisin' tai '-t' lopettaa:");
			syote = lukija.next();
			if (syote.equalsIgnoreCase("takaisin") || syote.equalsIgnoreCase("-t")) 
				break l;
				
			kurssinumero = parsePosInt(syote);
			if (kurssinumero < 0)
				continue;
			
			for (int i = 0; i < kurssit.size(); i++) {
				if (kurssit.get(i).getKurssinro() == kurssinumero) {
					jarj.poistaKurssi(i);
					System.out.println("Kurssi poistettu.");
					break l;
				}
			}
			System.out.println("Antamasi kurssinumero on virheellinen. Kurssia ei voitu poistaa.");
		}
		
	}
	
	private static Tapahtuma luoTapahtuma(){
		Scanner lukija = new Scanner(System.in);
		System.out.println("Anna tapahtuman nimi:");
		String nimi = lukija.nextLine();
		System.out.println("Anna tapahtuman paikka:");
		String paikka = lukija.nextLine();
		System.out.println("Anna tapahtuman tyyppi:\n" +
				"'1': luento\n" +
				"'2': harjoitus\n" +
				"'3': tentti\n" +
				"'4': opintopiiri\n" +
				"'5': muu");
		int tyyppi;
		while (true){
			try{
				tyyppi = Integer.parseInt(lukija.next());
			}
			catch (NumberFormatException e){
				System.out.println("Ilmoita tyyppi kokonaislukuna v�lilt� 1-5");
				continue;
			}
			if (1 > tyyppi || 5 < tyyppi){
				System.out.println("Ilmoita tyyppi kokonaislukuna v�lilt� 1-5");
				continue;
			}
			break;
		}
		int alkuaikaTunnit = luePosLuku(lukija, "Anna tapahtuman alkutunti:");
		int alkuaikaMinuutit = luePosLuku(lukija, "Anna tapahtuman alkuminuutti:");
		int alkupaiva = luePosLuku(lukija, "Anna tapahtuman alkup�iv�:");
		int alkukuu = luePosLuku(lukija, "Anna tapahtuman alkukuu:");
		int alkuvuosi = luePosLuku(lukija, "Anna tapahtuman alkuvuosi:");
		int loppuaikaTunnit = luePosLuku(lukija, "Anna tapahtuman lopputunti:");
		int loppuaikaMinuutit = luePosLuku(lukija, "Anna tapahtuman loppuminuutti:");
		int loppupaiva = luePosLuku(lukija, "Anna tapahtuman loppup�iv�:");
		int loppukuu = luePosLuku(lukija, "Anna tapahtuman loppukuu:");
		int loppuvuosi = luePosLuku(lukija, "Anna tapahtuman loppuvuosi:");
		return new Tapahtuma(nimi, paikka, tyyppi, alkuaikaTunnit, alkuaikaMinuutit, alkupaiva, alkukuu, alkuvuosi, loppuaikaTunnit, loppuaikaMinuutit, loppupaiva, loppukuu, loppuvuosi);
	}
	
	private static int luePosLuku(Scanner s, String viesti){
		int luku;
		while (true){
			System.out.println(viesti);
			luku = parsePosInt(s.next());
			if (luku < 0)
				continue;
			break;
		}
		return luku;
	}
	
	private static int parsePosInt(String input){
		int luku;
		try {
			luku = Integer.parseInt(input);
		}
		catch (NumberFormatException e){
			System.out.println(input + " ei ole numero");
			return -1;
		}
		if (luku < 0)
			System.out.println(input + " ei ole positiivinen");
		return luku;
		
	}
}
